package com.ce.server.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.List;

/**
 * @DATE: 2021/11/14 17:34
 * @Author: 小爽帅到拖网速
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {

  @Bean
  public Docket createRestApi(){
    return new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo())
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.ce.server.controller"))
            .paths(PathSelectors.any())
            .build()
            .securityContexts(securityContexts())
            .securitySchemes(securitySchemes());
  }
  private ApiInfo apiInfo(){
    return new ApiInfoBuilder()
            .title("校园防疫出入信息管理系统接口文档")
            .description("为加强校园防疫管理，学校将对北门和南门进出区域实施管理。只有本校学生(系统注册)才能进入学校")
            .contact(new Contact("CheckEntry","http://localhost:8081/doc.html","137213212@qq.com"))
            .version("1.0")
            .build();
  }
  private List<ApiKey> securitySchemes(){
    // 设置请求头信息
    List<ApiKey> result = new ArrayList<>();
    ApiKey apiKey = new ApiKey("Authorization","Authorization","Header");
    result.add(apiKey);
    return result;
  }

  private List<SecurityContext> securityContexts(){
    // 设置需要认证的路径
    List<SecurityContext> result = new ArrayList<>();
    result.add(getContextByPath("/hello/.*"));
    return result;
  }

  // 会使用到正则匹配
  private SecurityContext getContextByPath(String pathRegex) {
    // springfox.documentation.spi.service.contexts
    return SecurityContext.builder()
            .securityReferences(defaultAuth())
            .forPaths(PathSelectors.regex(pathRegex))
            .build();
  }

  private List<SecurityReference> defaultAuth() {

    List<SecurityReference> result = new ArrayList<>();
    // 描述作用范围
    AuthorizationScope authorizationScope = new AuthorizationScope("global","accessEverything");
    AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
    authorizationScopes[0] = authorizationScope;
    result.add(new SecurityReference("Authorization",authorizationScopes));
    return result;
  }
}
